package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomDate;
import br.com.telescope.adsrt.dom.DomEMail;
import br.com.telescope.adsrt.dom.DomFlag;
import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomLogin;
import br.com.telescope.adsrt.dom.DomPassword;
import br.com.telescope.adsrt.dom.DomPasswordHash;
import br.com.telescope.adsrt.dom.DomSelectionCheck;
import br.com.telescope.adsrt.dom.DomUpper;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.feature.DeleteFeature;
import br.com.telescope.t2.feature.InsertFeature;
import br.com.telescope.t2.feature.ListFeature;
import br.com.telescope.t2.feature.QueryFeature;
import br.com.telescope.t2.feature.UpdateFeature;
import solutions.ferpa.ztest.ent.*;

/**
 * Cadastro de usuários.
 * <p>
 * Interface de cadastramento dos usuários que podem acessar o sistema.
 * <P>
 * Permite consultar/informar os dados básicos dos usuários, bem como as 
 * funções (papéis, perfis, etc) que eles cumprem no sistema.
 * <P>
 * 
 * <P>
 * Telescope origin: RTAUTH.CAD_USUARIO
 * <P>
 * Base entity: RTAUTH.USUARIOS
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class CadUsuario extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "RTAUTH.CAD_USUARIO";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Cadastro de usuários");
    }
    
    protected EntUsuarios usua;
    protected EntUsuarios rec; // NEED_TJW1_COMPATIBILITY
    
    // Record items
    private DomUpper aNomeCompleto;
    private DomEMail aEMail;
    private DomLogin aLogin;
    private DomPasswordHash aSenhaHash;
    private DomFlag aAtivo;
    private DomFlag aSuperUsuario;
    private DomId aId;
    private DomId aMenuId;
    private DomId aPessoaId;
    private DomPassword aSenha;
    private DomDate aValidade;
    private DomSelectionCheck aFuncoes;
    
    // Query items
    private DomFlag qAtivo;
    private DomUpper qNomeCompleto;
    private DomLogin qLogin;
    private DomFlag qSuperUsuario;
    private DomEMail qEMail;
    
    @Override
    public void copyDefaultValues() {
        copyDefaultValue(usua.getAtivo(), aAtivo);
        copyDefaultValue(usua.getSuperUsuario(), aSuperUsuario);
    }
    
    @Override
    public String getBaseSql() {
        return "select USUA.*"
                + " from USUARIOS USUA";
    }
    
    @Override
    public void initAttributes() {
        
        aNomeCompleto = new DomUpper();
        aNomeCompleto.context(ctx).name("NOME_COMPLETO").label("Nome completo");
        
        aEMail = new DomEMail();
        aEMail.context(ctx).name("E_MAIL").label("E-mail");
        
        aLogin = new DomLogin();
        aLogin.context(ctx).name("LOGIN").label("Login");
        
        aSenhaHash = new DomPasswordHash();
        aSenhaHash.context(ctx).name("SENHA_HASH").label("Senha");
        
        aAtivo = new DomFlag();
        aAtivo.context(ctx).name("ATIVO").label("Ativo");
        aAtivo.setDefaultValue("S");
        
        aSuperUsuario = new DomFlag();
        aSuperUsuario.context(ctx).name("SUPER_USUARIO").label("Super usuário");
        aSuperUsuario.setDefaultValue("N");
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("ID");
        
        aMenuId = new DomId();
        aMenuId.context(ctx).name("MENU_ID").label("Menu inicial");
        
        aPessoaId = new DomId();
        aPessoaId.context(ctx).name("PESSOA_ID").label("Pessoa");
        
        aSenha = new DomPassword();
        aSenha.context(ctx).name("SENHA").label("Senha");
        
        aValidade = new DomDate();
        aValidade.context(ctx).name("VALIDADE").label("Validade");
        
        aFuncoes = new DomSelectionCheck();
        aFuncoes.context(ctx).name("FUNCOES").label("Funções").width(20).unbound(true);
        
        
        qAtivo = new DomFlag();
        qAtivo.context(ctx).name("ATIVO").label("Ativo");
        
        qNomeCompleto = new DomUpper();
        qNomeCompleto.context(ctx).name("NOME_COMPLETO").label("Nome completo");
        
        qLogin = new DomLogin();
        qLogin.context(ctx).name("LOGIN").label("Login");
        
        qSuperUsuario = new DomFlag();
        qSuperUsuario.context(ctx).name("SUPER_USUARIO").label("Super usuário");
        
        qEMail = new DomEMail();
        qEMail.context(ctx).name("E_MAIL").label("E-mail");
    }
    
    @Override
    public String getQueryPkColumn() {
        return "USUA.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntUsuarios getRecord() {
        if (usua == null) {
            usua = new EntUsuarios(ctx);
            rec = usua;
        }
        return this.usua;
    }
    
    @Override
    public String getContextName() {
        return aNomeCompleto.toText();
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "NOME_COMPLETO, E_MAIL, LOGIN, ATIVO";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="QUERY">
    public class FQuery extends QueryFeature {
        
        @Override
        public void initForm() {
            addField(qNomeCompleto, "opt");
            addField(qEMail, "opt");
            addField(qLogin, "opt");
            qAtivo.setDefaultValue("S");
            addField(qAtivo, "opt");
            addField(qSuperUsuario, "opt");
        }
        
        {
            setFeatureName("QUERY");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LIST">
    public class FList extends ListFeature {
        
        @Override
        public void initForm() {
            addField(aNomeCompleto, "view");
            addField(aEMail, "view");
            addField(aLogin, "view");
            addField(aAtivo, "view");
            addField(aSuperUsuario, "view");
        }
        
        {
            setFeatureName("LIST");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="UPDATE">
    public class FUpdate extends UpdateFeature {
        
        @Override
        public void initForm() {
            addField(aNomeCompleto, "opt");
            addField(aEMail, "opt");
            aLogin.setOptional(false);
            addField(aLogin, "rqd");
            addField(aSenhaHash, "opt");
            addField(aFuncoes, "opt");
            addField(aAtivo, "opt");
            addField(aSuperUsuario, "opt");
        }
        
        @Override
        public void preDisplay() {
            try {
                popularFuncoes();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        @Override
        public void posDisplay() {
            try {
                mostraSenhaUsuario();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        @Override
        public void posUpdate() {
            try {
                salvarFuncoesUsuario();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("UPDATE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DELETE">
    public class FDelete extends DeleteFeature {
        
        @Override
        public void initForm() {
            addField(aLogin, "view");
        }
        
        {
            setFeatureName("DELETE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="INSERT">
    public class FInsert extends InsertFeature {
        
        @Override
        public void initForm() {
            addField(aNomeCompleto, "opt");
            addField(aEMail, "opt");
            aLogin.setOptional(false);
            addField(aLogin, "rqd");
            aSenhaHash.setOptional(false);
            addField(aSenhaHash, "rqd");
            addField(aFuncoes, "opt");
            addField(aAtivo, "opt");
            addField(aSuperUsuario, "opt");
        }
        
        @Override
        public void posInsert() {
            try {
                salvarFuncoesUsuario();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        @Override
        public void preDisplay() {
            try {
                popularFuncoes();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("INSERT");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FQuery());
        addFeature(new FList());
        addFeature(new FUpdate());
        addFeature(new FDelete());
        addFeature(new FInsert());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "QUERY";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public String getNomeCompleto() {
        return aNomeCompleto.getValue();
    }
    
    public void setNomeCompleto(String value) {
        this.aNomeCompleto.setValue(value);
    }
    
    public String getEMail() {
        return aEMail.getValue();
    }
    
    public void setEMail(String value) {
        this.aEMail.setValue(value);
    }
    
    public String getLogin() {
        return aLogin.getValue();
    }
    
    public void setLogin(String value) {
        this.aLogin.setValue(value);
    }
    
    public String getSenhaHash() {
        return aSenhaHash.getValue();
    }
    
    public void setSenhaHash(String value) {
        this.aSenhaHash.setValue(value);
    }
    
    public String getAtivo() {
        return aAtivo.getValue();
    }
    
    public void setAtivo(String value) {
        this.aAtivo.setValue(value);
    }
    
    public String getSuperUsuario() {
        return aSuperUsuario.getValue();
    }
    
    public void setSuperUsuario(String value) {
        this.aSuperUsuario.setValue(value);
    }
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public Long getMenuId() {
        return aMenuId.getValue();
    }
    
    public void setMenuId(Long value) {
        this.aMenuId.setValue(value);
    }
    
    public Long getPessoaId() {
        return aPessoaId.getValue();
    }
    
    public void setPessoaId(Long value) {
        this.aPessoaId.setValue(value);
    }
    
    public String getSenha() {
        return aSenha.getValue();
    }
    
    public void setSenha(String value) {
        this.aSenha.setValue(value);
    }
    
    public java.sql.Date getValidade() {
        return aValidade.getValue();
    }
    
    public void setValidade(java.sql.Date value) {
        this.aValidade.setValue(value);
    }
    
    public String getFuncoes() {
        return aFuncoes.getValue();
    }
    
    public void setFuncoes(String value) {
        this.aFuncoes.setValue(value);
    }
    public String getQueryNomeCompleto() {
        return qNomeCompleto.getQueryValue();
    }
    
    public void setQueryNomeCompleto(String value) {
        this.qNomeCompleto.setQueryValue(value);
    }
    public String getQueryEMail() {
        return qEMail.getQueryValue();
    }
    
    public void setQueryEMail(String value) {
        this.qEMail.setQueryValue(value);
    }
    public String getQueryLogin() {
        return qLogin.getQueryValue();
    }
    
    public void setQueryLogin(String value) {
        this.qLogin.setQueryValue(value);
    }
    public String getQueryAtivo() {
        return qAtivo.getQueryValue();
    }
    
    public void setQueryAtivo(String value) {
        this.qAtivo.setQueryValue(value);
    }
    public String getQuerySuperUsuario() {
        return qSuperUsuario.getQueryValue();
    }
    
    public void setQuerySuperUsuario(String value) {
        this.qSuperUsuario.setQueryValue(value);
    }
    // </editor-fold>
    
    /**
     * Mostra senha do usuário.
     * <p>
     * Quando um super usuário está consultando os registros de usuários 
     * cadastrados, apresenta um botão que apresenta a senha.
     */
    private void mostraSenhaUsuario() throws AdsException {
        // <user-code id="752767" parentId="752764" hashcode="-7781505a" length="31">
        // do nothing - Não tem na T2
        
        // </user-code>
    }
    
    /**
     * Popular as funções.
     */
    private void popularFuncoes() throws AdsException {
        // <user-code id="755538" parentId="752768" hashcode="2542e985" length="554">
        aFuncoes.addSqlOptions("select fs.id" +
                " , fs.titulo" +
                " , null" +
                " from funcoes_sistemas fs" +
                " order by fs.titulo");
        
        if (getId() != null) {
            StringBuilder out = new StringBuilder();
            EntFuncoesSistemas fusi = new EntFuncoesSistemas(ads);
            fusi.find("select funcao_id from funcoes_usuarios where usuario_id=" + getId());
            while(fusi.next()) {
                if (out.length()>0) out.append(",");
                out.append(fusi.getId());
            }
            fusi.close();
            aFuncoes.setValue(out.toString());
        }
        
        // </user-code>
    }
    
    /**
     * Salvar funções do usuário.
     * <p>
     * Grava as funções que o usuário exerce.
     */
    private void salvarFuncoesUsuario() throws AdsException {
        // <user-code id="806828" parentId="752771" hashcode="-45c4051a" length="411">
        EntFuncoesUsuarios funusu = new EntFuncoesUsuarios(ads);
        funusu.del("select id" +
                " from funcoes_usuarios" +
                " where usuario_id = " + rec.valueOfId());
        String[] ids = aFuncoes.getValue().split(",");
        for (String id : ids) {
            if (id.length()>0) {
                funusu.nullifyId();
                funusu.setFuncaoId(id);
                funusu.setUsuarioId(rec.valueOfId());
                funusu.ins();
            }
        }
        // </user-code>
    }
}
